From 700ef753a8219852bfce7ea21a5881e8578ca680 Mon Sep 17 00:00:00 2001 From: robertlipe Date: Fri, 6 Sep 2013 20:38:11 +0000 Subject: [PATCH] Move remaining char*'s in xmltag to QStrings. Tweak various callers and copy ctors. vtesto on CentOS 6.4 seems no worse for the wear. --- gpsbabel/delbin.cc | 6 +++--- gpsbabel/gpsbabel.supp | 1 - gpsbabel/gpx.cc | 26 +++++++------------------- gpsbabel/html.cc | 6 +++--- gpsbabel/kml.cc | 30 +++++++++++------------------- gpsbabel/src/core/xmltag.h | 9 +++------ gpsbabel/text.cc | 6 +++--- gpsbabel/util.cc | 2 +- gpsbabel/xmltag.cc | 18 +++++------------- 9 files changed, 36 insertions(+), 68 deletions(-) diff --git a/gpsbabel/delbin.cc b/gpsbabel/delbin.cc index 4a4db13ac..87a97fd52 100644 --- a/gpsbabel/delbin.cc +++ b/gpsbabel/delbin.cc @@ -1277,7 +1277,7 @@ get_gc_notes(const waypoint* wp, int* symbol, char** notes, unsigned* notes_size for (; curlog; curlog = xml_findnext(root, curlog, "groundspeak:log")) { xml_tag* logpart = xml_findfirst(curlog, "groundspeak:type"); if (logpart) { - gbfprintf(fd, "%s\n", logpart->cdata); + gbfprintf(fd, "%s\n", CSTR(logpart->cdata)); } logpart = xml_findfirst(curlog, "groundspeak:date"); if (logpart) { @@ -1287,13 +1287,13 @@ get_gc_notes(const waypoint* wp, int* symbol, char** notes, unsigned* notes_size } logpart = xml_findfirst(curlog, "groundspeak:finder"); if (logpart) { - char* s = cet_str_utf8_to_any(logpart->cdata, global_opts.charset); + char* s = cet_str_utf8_to_any(CSTR(logpart->cdata), global_opts.charset); gbfputs(s, fd); xfree(s); } logpart = xml_findfirst(curlog, "groundspeak:text"); if (logpart) { - char* s = cet_str_utf8_to_any(logpart->cdata, global_opts.charset); + char* s = cet_str_utf8_to_any(CSTR(logpart->cdata), global_opts.charset); gbfprintf(fd, ", %s", s); xfree(s); } diff --git a/gpsbabel/gpsbabel.supp b/gpsbabel/gpsbabel.supp index dff92e883..5e192c7ba 100644 --- a/gpsbabel/gpsbabel.supp +++ b/gpsbabel/gpsbabel.supp @@ -39,4 +39,3 @@ ... fun:_ZN11QTextStreamC1EP9QIODevice } - diff --git a/gpsbabel/gpx.cc b/gpsbabel/gpx.cc index cd3f87e5d..b0cec01f9 100644 --- a/gpsbabel/gpx.cc +++ b/gpsbabel/gpx.cc @@ -551,7 +551,7 @@ start_something_else(const QString el, const QXmlStreamAttributes& attr) } new_tag = new xml_tag; - new_tag->tagname = xstrdup(CSTR(el)); + new_tag->tagname = el; attr_count = attr.size(); new_tag->attributes = (char**)xcalloc(sizeof(char*),2*attr_count+1); @@ -1189,7 +1189,7 @@ gpx_end(const QString& el) static void gpx_cdata(const QString& s) { - char** cdata; + QString* cdata; xml_tag* tmp_tag; cdatastr = s; @@ -1206,10 +1206,7 @@ gpx_cdata(const QString& s) } else { cdata = &(cur_tag->cdata); } - if (*cdata) { - xfree(*cdata); - } - *cdata = xstrdup(CSTR(cdatastr)); + *cdata = cdatastr; } static void @@ -1339,27 +1336,27 @@ fprint_xml_chain(xml_tag* tag, const waypoint* wpt) while (tag) { writer->writeStartElement(tag->tagname); - if (!tag->cdata && !tag->child) { + if (tag->cdata.isEmpty() && !tag->child) { write_tag_attributes(tag); // No children? Self-closing tag. writer->writeEndElement(); } else { write_tag_attributes(tag); - if (tag->cdata) { + if (!tag->cdata.isEmpty()) { writer->writeCharacters(tag->cdata); } if (tag->child) { fprint_xml_chain(tag->child, wpt); } if (wpt && wpt->gc_data->exported.isValid() && - strcmp(tag->tagname, "groundspeak:cache") == 0) { + tag->tagname.compare("groundspeak:cache") == 0) { writer->writeTextElement("time", wpt->gc_data->exported.toPrettyString()); } writer->writeEndElement(); } - if (tag->parentcdata && tag->parentcdata[0]) { + if (!tag->parentcdata.isEmpty()) { // FIXME: The length check is necessary to get line endings correct in our test suite. // Writing the zero length string eats a newline, at least with Qt 4.6.2. writer->writeCharacters(tag->parentcdata); @@ -1374,18 +1371,9 @@ void free_gpx_extras(xml_tag* tag) char** ap; while (tag) { - if (tag->cdata) { - xfree(tag->cdata); - } if (tag->child) { free_gpx_extras(tag->child); } - if (tag->parentcdata) { - xfree(tag->parentcdata); - } - if (tag->tagname) { - xfree(tag->tagname); - } if (tag->attributes) { ap = tag->attributes; diff --git a/gpsbabel/html.cc b/gpsbabel/html.cc index 0e3b894cc..89fa613b6 100644 --- a/gpsbabel/html.cc +++ b/gpsbabel/html.cc @@ -168,12 +168,12 @@ html_disp(const waypoint* wpt) logpart = xml_findfirst(curlog, "groundspeak:type"); if (logpart) { - gbfprintf(file_out, "%s by ", logpart->cdata); + gbfprintf(file_out, "%s by ", CSTR(logpart->cdata)); } logpart = xml_findfirst(curlog, "groundspeak:finder"); if (logpart) { - char* f = html_entitize(logpart->cdata); + char* f = html_entitize(CSTR(logpart->cdata)); gbfprintf(file_out, "%s on ", f); xfree(f); } @@ -223,7 +223,7 @@ html_disp(const waypoint* wpt) if (html_encrypt && encoded) { s = rot13(logpart->cdata); } else { - s = xstrdup(logpart->cdata); + s = xstrdup(CSTR(logpart->cdata)); } t = html_entitize(s); diff --git a/gpsbabel/kml.cc b/gpsbabel/kml.cc index 005f5309b..a2f2e3e9c 100644 --- a/gpsbabel/kml.cc +++ b/gpsbabel/kml.cc @@ -1,8 +1,7 @@ /* Support for Google Earth & Keyhole "kml" format. - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Robert Lipe, - robertlipe@gpsbabel.org + Copyright (C) 2005-2013 Robert Lipe, robertlipe@gpsbabel.org Updates by Andrew Kirmse, akirmse at google.com This program is free software; you can redistribute it and/or modify @@ -1304,10 +1303,9 @@ char* kml_gc_mkstar(int rating) return tmp; } -// Returns an allocated buffer that must be freed. -char* kml_geocache_get_logs(const waypoint* wpt) +QString kml_geocache_get_logs(const waypoint* wpt) { - char* r = xstrdup(""); + QString r; fs_xml* fs_gpx = (fs_xml*)fs_chain_find(wpt->fs, FS_GPX); xml_tag* root = NULL; @@ -1325,16 +1323,12 @@ char* kml_geocache_get_logs(const waypoint* wpt) // branches will always be taken. logpart = xml_findfirst(curlog, "groundspeak:type"); if (logpart) { - r = xstrappend(r, "

"); - r = xstrappend(r, logpart->cdata); - r = xstrappend(r, ""); + r = r + "

" + logpart->cdata + ""; } logpart = xml_findfirst(curlog, "groundspeak:finder"); if (logpart) { - r = xstrappend(r, " by "); - r = xstrappend(r, logpart->cdata); - // xfree( f ); + r = r + " by " + logpart->cdata; } logpart = xml_findfirst(curlog, "groundspeak:date"); @@ -1347,7 +1341,7 @@ char* kml_geocache_get_logs(const waypoint* wpt) t.date().year(), t.date().month(), t.date().day()); - r = xstrappend(r, temp); + r += temp; xfree(temp); } } @@ -1364,17 +1358,17 @@ char* kml_geocache_get_logs(const waypoint* wpt) if (html_encrypt && encoded) { s = rot13(logpart->cdata); } else { - s = xstrdup(logpart->cdata); + s = xstrdup(CSTR(logpart->cdata)); } - r = xstrappend(r, "
"); + r = r + "
"; t = html_entitize(s); - r = xstrappend(r, t); + r = r + t; xfree(t); xfree(s); } - r = xstrappend(r, "

"); + r += "

"; curlog = xml_findnext(root, curlog, "groundspeak:log"); } return r; @@ -1420,7 +1414,6 @@ static void kml_geocache_pr(const waypoint* waypointp) char date_placed[100]; // Always long engough for a date. const char* issues = ""; - char* logs; writer->writeStartElement("Placemark"); @@ -1491,9 +1484,8 @@ static void kml_geocache_pr(const waypoint* waypointp) kml_write_data_element("gc_icon", is); kml_write_cdata_element("gc_short_desc", waypointp->gc_data->desc_short.utfstring); kml_write_cdata_element("gc_long_desc", waypointp->gc_data->desc_long.utfstring); - logs = kml_geocache_get_logs(waypointp); + QString logs = kml_geocache_get_logs(waypointp); kml_write_cdata_element("gc_logs", logs); - xfree(logs); writer->writeEndElement(); // Close ExtendedData tag diff --git a/gpsbabel/src/core/xmltag.h b/gpsbabel/src/core/xmltag.h index 41ce891fd..4c9a7c82e 100644 --- a/gpsbabel/src/core/xmltag.h +++ b/gpsbabel/src/core/xmltag.h @@ -19,17 +19,14 @@ class xml_tag { public: xml_tag() : - tagname(NULL), - cdata(NULL), - parentcdata(NULL), attributes(NULL), parent(NULL), sibling(NULL), child(NULL) {} - char* tagname; - char* cdata; - char* parentcdata; + QString tagname; + QString cdata; + QString parentcdata; char** attributes; xml_tag* parent; xml_tag* sibling; diff --git a/gpsbabel/text.cc b/gpsbabel/text.cc index 116ab8461..69e3e2a90 100644 --- a/gpsbabel/text.cc +++ b/gpsbabel/text.cc @@ -182,12 +182,12 @@ text_disp(const waypoint* wpt) logpart = xml_findfirst(curlog, "groundspeak:type"); if (logpart) { - gbfprintf(file_out, "%s by ", logpart->cdata); + gbfprintf(file_out, "%s by ", CSTR(logpart->cdata)); } logpart = xml_findfirst(curlog, "groundspeak:finder"); if (logpart) { - gbfprintf(file_out, "%s on ", logpart->cdata); + gbfprintf(file_out, "%s on ", CSTR(logpart->cdata)); } logpart = xml_findfirst(curlog, "groundspeak:date"); @@ -232,7 +232,7 @@ text_disp(const waypoint* wpt) if (txt_encrypt && encoded) { s = rot13(logpart->cdata); } else { - s = xstrdup(logpart->cdata); + s = xstrdup(CSTR(logpart->cdata)); } gbfprintf(file_out, "%s", s); diff --git a/gpsbabel/util.cc b/gpsbabel/util.cc index 4d9aa9136..66583a438 100644 --- a/gpsbabel/util.cc +++ b/gpsbabel/util.cc @@ -1780,7 +1780,7 @@ xml_tag* xml_findnext(xml_tag* root, xml_tag* cur, const char* tagname) xml_tag* result = cur; do { result = xml_next(root, result); - } while (result && case_ignore_strcmp(result->tagname, tagname)); + } while (result && result->tagname.compare(tagname, Qt::CaseInsensitive)); return result; } diff --git a/gpsbabel/xmltag.cc b/gpsbabel/xmltag.cc index 5e11276d1..1db0cf403 100644 --- a/gpsbabel/xmltag.cc +++ b/gpsbabel/xmltag.cc @@ -33,18 +33,9 @@ free_xml_tag(xml_tag* tag) char** ap; while (tag) { - if (tag->cdata) { - xfree(tag->cdata); - } if (tag->child) { free_gpx_extras(tag->child); } - if (tag->parentcdata) { - xfree(tag->parentcdata); - } - if (tag->tagname) { - xfree(tag->tagname); - } if (tag->attributes) { ap = tag->attributes; @@ -61,6 +52,7 @@ free_xml_tag(xml_tag* tag) } } +// FIXME: at some point, this becomes a plain ole copy constructor. static void copy_xml_tag(xml_tag** copy, xml_tag* src, xml_tag* parent) { @@ -77,10 +69,10 @@ copy_xml_tag(xml_tag** copy, xml_tag* src, xml_tag* parent) res = new xml_tag; *copy = res; - memcpy(res, src, sizeof(xml_tag)); - res->tagname = xstrdup(src->tagname); - res->cdata = xstrdup(src->cdata); - res->parentcdata = xstrdup(src->parentcdata); +// memcpy(res, src, sizeof(xml_tag)); + res->tagname = (src->tagname); + res->cdata = (src->cdata); + res->parentcdata = (src->parentcdata); if (src->attributes) { ap = src->attributes; while (*ap) { -- 2.30.2